#pragma once
#include "Reactor.hpp"
#include "Service.hpp"
#include "Sock.hpp"
#include "Util.hpp"

int Accepter(Event *evp) //这是Litsen的回调函数
{
    // ET方式下，listen就绪只会通知一次
    //所以我们要一次性读完 底层建立好的链接
    while (true)
    {
        int sock = Sock::Accept(evp->sock);
        if (sock < 0) //底层没有新链接了
        {
            std::cout << "Accept Done!" << std::endl;
            break;
        }
        //读取到底层链接
        //将该链接封装进Event，并添加到epoll和Reactor
        SetNonBlock(sock);
        Event *normal_ev = new Event();
        normal_ev->sock = sock;
        normal_ev->R = evp->R; //和listen在一个Reactor里
        // recver, sender, errorer,就是我们代码中的较顶层，只负责真正的读取
        normal_ev->RegisterCallback(Recver, Sender, Errorer);

        evp->R->InsertEvent(normal_ev, EPOLLIN | EPOLLET);
    }
}